<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    function constr() { }
    constr.prototype.obj = { fqm: 'yysjjd' }
    constr.prototype.property = 123

    // > 对于栈指向的地址不继续读取 直接赋值
    let obj1 = new constr()
    // 此时直接基于栈的地址数据直接赋值一个新的数据，那么不会改变原型链上原有的引用类型的属性，
    // 而是自身实例即obj1里创建一个 obj = { yy: 'sjjd' }
    obj1.obj = { yy: 'sjjd' }
    // 基本类型，也是基于栈的数据直接赋值，所以也不会改变原型链上原有的引用类型的属性，
    // obj1自身创建一个property = 456
    obj1.property = 456
    // 打印可以看到原型链的数据完全没有变化
    console.dir(constr.prototype)
    // obj1多了两个属性property和obj
    console.dir(obj1)

    debugger

    // > 对于栈指向的地址继续读取 再赋值
    let obj2 = new constr()

    // 此时不是基于栈的数据改变了，而是通过栈的地址访问了堆的数据(就是原型链的存放值)改变了，
    // 此时就是直接对具体的原型链的引用属性的值进行改变了，而且自身obj2不会添加 obj = { yy: 'sjjd' }
    obj2.obj.fqm = 'yybjjzw'
    // 同obj1
    obj2.property = 456
    // 这里可以看到型链的数据的引用类型obj变化了
    console.dir(constr.prototype)
    // obj2只多了一个属性property
    console.dir(obj2)

  </script>
</body>

</html>